package com.code.day15DuoXianC.Runnable03;

/**
 * MyRunnable类实现了Runnable接口，用于模拟多线程卖票的场景
 * 该类包含共享的票数资源和同步机制，确保多线程环境下的线程安全
 */
public class MyRunnable implements Runnable {
    int tickets = 100;
    Object obj = new Object();

    /**
     * run方法是线程执行的主体逻辑
     * 该方法实现了卖票的核心业务逻辑，包括：
     * 1. 线程休眠模拟实际业务处理时间
     * 2. 使用synchronized关键字保证线程安全
     * 3. 循环售卖票直到票数为0
     *
     * 无参数
     * 无返回值
     */
    @Override
    public void run() {
        // 持续卖票的主循环
        while (true) {
            try {
                // 线程休眠1秒，模拟卖票过程中的业务处理时间
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            // 使用synchronized同步代码块，确保同一时刻只有一个线程能访问票数资源
            synchronized (obj) {
                // 检查是否还有剩余票数
                if (tickets > 0) {
                    // 输出当前线程正在售卖的票号
                    System.out.println(Thread.currentThread().getName() + "正在卖第" + tickets + "张票");
                    // 票数减1
                    tickets--;
                }
            }
        }
    }
}

